package com.qqserver;

import com.loy.entity.Message;
import com.loy.entity.MessageType;
import com.loy.entity.User;
import com.service.ManageClientThreads;
import com.thread.ServerConnectClientThread;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

/**
 * 1. 这是服务端
 *  监听端口，等待客户端链接，并保持通信
 */
public class QQserver {
    // 创建一个集合，存储多个用户
    private static Map<String,User> validUsers = new HashMap<>();
    static {
        // 在进行 QQserver 类加载的时候，执行，并且只执行一次
        validUsers.put("100",new User("100","123456"));
        validUsers.put("200",new User("200","123456"));
        validUsers.put("300",new User("300","123456"));
        validUsers.put("至尊宝",new User("至尊宝","123456"));
        validUsers.put("紫霞仙子",new User("紫霞仙子","123456"));
        validUsers.put("菩提老祖",new User("菩提老祖","123456"));
    }

    private ServerSocket ss=null;
    public QQserver() {
        // 端口可以下载一个配置文件中
        System.out.println("服务端在9999端口监听...");
        try {
            ss = new ServerSocket(9999);
            while (true){
                // 当和某一个客户端建立链接之后，会继续监听其他来来链接的客户端
                Socket socket = ss.accept();
                // 1. 得到对象输入流
                ObjectInputStream ois
                        = new ObjectInputStream(socket.getInputStream());
                // 2. 读取客户端发送的数据，第一次发送过来的是 user对象
                User u = (User) ois.readObject();
                // 3.验证客户端发送过来的用户是否合法
                Message message = new Message();
                ObjectOutputStream oos
                        = new ObjectOutputStream(socket.getOutputStream());
                if(chechUser(u.getUserId(),u.getPassword())){
                    message.setMesType(MessageType.MESSAGE_LOGIN_SUCCEED);
                    oos.writeObject(message);// 将message回复给客户端
                    // 创建一个线程，和客户端保持通信
                    // 该线程，持有当前socket对象
                    ServerConnectClientThread scct
                            = new ServerConnectClientThread(socket, u.getUserId());
                    // 启动线程
                    scct.start();
                    // 把该线程对象，放入到一个集合中，进行管理
                    ManageClientThreads.addServerConnectClientThread(u.getUserId(),scct);
                }else {
                    // 验证失败
                    System.out.println("用户 id = " + u.getUserId() + "pwd = " + u.getPassword()+"验证失败！");
                    message.setMesType(MessageType.MESSAGE_LOGIN_FAIL);
                    oos.writeObject(message);// 将message回复给客户端
                    // 如果登录失败，需要关闭当前的 socket
                    socket.close();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                // 如果服务器退出了 while,说明服务器不在监听，所以需要关闭 serversocket
                ss.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 1.校验用户照账号密码是否合法
     * @param userId
     * @param passwd
     * @return
     */
    private boolean chechUser(String userId,String passwd){
        User user = validUsers.get(userId);
        if(user==null){
            return false;
        }
        if(!user.getPassword().equals(passwd)){
            return false;
        }
        return true;
    }
}
